from django.utils import timezone
from rest_framework import serializers
from .models import Permission, RolePermission, TemporaryPermission
from django.contrib.auth.models import User
from apps.roles.models import Role

class PermissionSerializer(serializers.ModelSerializer):
    """
    权限序列化器，用于处理权限的创建、更新、查询等操作。
    """
    class Meta:
        model = Permission
        fields = ['id', 'permission_name', 'description', 'created_at', 'updated_at']
        read_only_fields = ['id', 'created_at', 'updated_at']

    def validate_permission_name(self, value):
        """
        验证权限名称唯一性。
        """
        if Permission.objects.filter(permission_name=value).exists():
            raise serializers.ValidationError(f"权限名称 '{value}' 已存在。")
        return value


class RolePermissionSerializer(serializers.ModelSerializer):
    """
    角色与权限的关联序列化器，用于处理角色与权限之间的关系。
    """
    role_name = serializers.CharField(source='role.name', read_only=True)  # 获取角色名称
    permission_name = serializers.CharField(source='permission.permission_name', read_only=True)  # 获取权限名称

    class Meta:
        model = RolePermission
        fields = ['role', 'role_name', 'permission', 'permission_name']
        read_only_fields = ['role_name', 'permission_name']

    def validate(self, data):
        """
        确保角色与权限之间的关系唯一。
        """
        if RolePermission.objects.filter(role=data['role'], permission=data['permission']).exists():
            raise serializers.ValidationError("该角色已拥有该权限。")
        return data


class TemporaryPermissionSerializer(serializers.ModelSerializer):
    """
    临时权限序列化器，用于处理用户的临时权限信息。
    """
    user_username = serializers.CharField(source='user.username', read_only=True)  # 获取用户用户名
    permission_name = serializers.CharField(source='permission.permission_name', read_only=True)  # 获取权限名称

    class Meta:
        model = TemporaryPermission
        fields = ['id', 'user', 'user_username', 'permission', 'permission_name', 'start_date', 'end_date', 'is_active']
        read_only_fields = ['id', 'user_username', 'permission_name']

    def validate(self, data):
        """
        验证临时权限的生效和失效时间。
        """
        start_date = data.get('start_date')
        end_date = data.get('end_date')

        # 确保结束时间大于开始时间
        if start_date >= end_date:
            raise serializers.ValidationError("结束时间必须大于开始时间")

        # 确保开始时间不能在当前时间之前
        if start_date < timezone.now():
            raise serializers.ValidationError("临时权限的开始时间不能在当前时间之前")

        return data

    def create(self, validated_data):
        """
        创建临时权限时，确保权限处于有效状态。
        """
        validated_data['is_active'] = True
        return super().create(validated_data)
